package org.midi.jdic;

/*
 * Copyright (C) 2004 Sun Microsystems, Inc. All rights reserved. Use is
 * subject to license terms.
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the Lesser GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 * USA.
 */

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.SwingConstants;
import java.io.File;
import java.net.URL;
import java.net.MalformedURLException;

import org.jdesktop.jdic.browser.*;

/**
 * JDIC API demo main class.
 * <p>
 * <code>Browser</code> is a GUI application demonstrating the usage of the
 * JDIC API package <code>org.jdesktop.jdic.browser</code> (Browser
 * component).
 */

public class Browser extends JPanel {
	public static ImageIcon browseIcon = new ImageIcon(Browser.class
			.getResource("images/Right.gif"));

	BorderLayout borderLayout1 = new BorderLayout();

	JToolBar jBrowserToolBar = new JToolBar();

	JButton jStopButton = new JButton("Stopp", new ImageIcon(getClass()
			.getResource("images/Stop.png")));

	JButton jRefreshButton = new JButton("Refresh", new ImageIcon(getClass()
			.getResource("images/Reload.png")));

	JButton jForwardButton = new JButton("Forward", new ImageIcon(getClass()
			.getResource("images/Forward.png")));

	JButton jBackButton = new JButton("Back", new ImageIcon(getClass()
			.getResource("images/Back.png")));

	JPanel jAddressPanel = new JPanel();

	JLabel jAddressLabel = new JLabel();

	JTextField jAddressTextField = new JTextField();

	JButton jGoButton = new JButton();

	JPanel jAddrToolBarPanel = new JPanel();

	MyStatusBar statusBar = new MyStatusBar();

	JPanel jBrowserPanel = new JPanel();

	WebBrowser webBrowser;

	public Browser() {
		try {
			jbInit();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		} catch (Exception e) {
		}

		JFrame frame = new JFrame("JDIC API Demo - Browser");

		Container contentPane = frame.getContentPane();

		contentPane.setLayout(new GridLayout(1, 1));
		contentPane.add(new Browser());

		frame.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});

		frame.pack();
		frame.setVisible(true);
	}

	private void jbInit() throws Exception {
		this.setLayout(borderLayout1);

		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

		this.setPreferredSize(new Dimension(screenSize.width * 9 / 10,
				screenSize.height * 8 / 10));

		ToolTipManager.sharedInstance().setLightWeightPopupEnabled(false);

		jAddressLabel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4));
		jAddressLabel.setToolTipText("");
		jAddressLabel.setText(" URL: ");

		jGoButton.setBorder(BorderFactory.createCompoundBorder(new EmptyBorder(
				0, 2, 0, 2), new EtchedBorder()));
		jGoButton.setMaximumSize(new Dimension(60, 25));
		jGoButton.setMinimumSize(new Dimension(60, 25));
		jGoButton.setPreferredSize(new Dimension(60, 25));
		jGoButton.setToolTipText("Load the given URL");
		jGoButton.setIcon(browseIcon);
		jGoButton.setText("GO");
		jGoButton.addActionListener(new Browser_jGoButton_actionAdapter(this));
		jAddressPanel.setLayout(new BorderLayout());

		jAddressTextField
				.addActionListener(new Browser_jAddressTextField_actionAdapter(
						this));
		jBackButton.setToolTipText("Go back one page");
		jBackButton.setHorizontalTextPosition(SwingConstants.TRAILING);
		jBackButton.setEnabled(false);
		jBackButton.setMaximumSize(new Dimension(75, 27));
		jBackButton.setPreferredSize(new Dimension(75, 27));
		jBackButton.addActionListener(new Browser_jBackButton_actionAdapter(
				this));
		jForwardButton.setToolTipText("Go forward one page");
		jForwardButton.setEnabled(false);
		jForwardButton
				.addActionListener(new Browser_jForwardButton_actionAdapter(
						this));
		jRefreshButton.setToolTipText("Reload current page");
		jRefreshButton.setEnabled(true);
		jRefreshButton.setMaximumSize(new Dimension(75, 27));
		jRefreshButton.setMinimumSize(new Dimension(75, 27));
		jRefreshButton.setPreferredSize(new Dimension(75, 27));
		jRefreshButton
				.addActionListener(new Browser_jRefreshButton_actionAdapter(
						this));
		jStopButton.setToolTipText("Stop loading this page");
		jStopButton.setVerifyInputWhenFocusTarget(true);
		jStopButton.setText("Stop");
		jStopButton.setEnabled(true);
		jStopButton.setMaximumSize(new Dimension(75, 27));
		jStopButton.setMinimumSize(new Dimension(75, 27));
		jStopButton.setPreferredSize(new Dimension(75, 27));
		jStopButton.addActionListener(new Browser_jStopButton_actionAdapter(
				this));
		jAddressPanel.add(jAddressLabel, BorderLayout.WEST);
		jAddressPanel.add(jAddressTextField, BorderLayout.CENTER);
		jAddressPanel.add(jGoButton, BorderLayout.EAST);
		jAddressPanel.setBorder(BorderFactory.createCompoundBorder(
				BorderFactory.createEtchedBorder(), BorderFactory
						.createEmptyBorder(2, 0, 2, 0)));

		jBrowserToolBar.setFloatable(false);
		jBrowserToolBar.add(jBackButton, null);
		jBrowserToolBar.add(jForwardButton, null);
		jBrowserToolBar.addSeparator();
		jBrowserToolBar.add(jRefreshButton, null);
		jBrowserToolBar.add(jStopButton, null);
		jBrowserToolBar.setBorder(BorderFactory.createCompoundBorder(
				BorderFactory.createEtchedBorder(), BorderFactory
						.createEmptyBorder(2, 2, 2, 0)));

		jAddrToolBarPanel.setLayout(new BorderLayout());
		jAddrToolBarPanel.add(jAddressPanel, BorderLayout.CENTER);
		jAddrToolBarPanel.add(jBrowserToolBar, BorderLayout.WEST);
		jAddrToolBarPanel
				.setBorder(BorderFactory.createEmptyBorder(0, 0, 2, 0));

		statusBar.setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0));
		statusBar.lblDesc.setText("JDIC API Demo - Browser");

		try {
			webBrowser = new WebBrowser(new URL("http://java.net"));
			webBrowser.executeScript("document.bgColor='blue';");
			// Print out debug messages in the command line.
			// webBrowser.setDebug(true);
		} catch (MalformedURLException e) {
			System.out.println(e.getMessage());
			return;
		}

		webBrowser.addWebBrowserListener(new WebBrowserListener() {
			public void downloadStarted(WebBrowserEvent event) {
				updateStatusInfo("Loading started.");
			}

			public void downloadCompleted(WebBrowserEvent event) {
				jBackButton.setEnabled(webBrowser.isBackEnabled());
				jForwardButton.setEnabled(webBrowser.isForwardEnabled());

				updateStatusInfo("Loading completed.");

				URL currentUrl = webBrowser.getURL();

				if (currentUrl != null) {
					jAddressTextField.setText(currentUrl.toString());
				}
			}

			public void downloadProgress(WebBrowserEvent event) {
				// updateStatusInfo("Loading in progress...");
			}

			public void downloadError(WebBrowserEvent event) {
				updateStatusInfo("Loading error.");
			}

			public void documentCompleted(WebBrowserEvent event) {
				updateStatusInfo("Document loading completed.");
			}

			public void titleChange(WebBrowserEvent event) {
				updateStatusInfo("Title of the browser window changed.");
			}

			public void statusTextChange(WebBrowserEvent event) {
				// updateStatusInfo("Status text changed.");
			}
		});

		jBrowserPanel.setLayout(new BorderLayout());
		jBrowserPanel.add(webBrowser, BorderLayout.CENTER);

		this.add(jAddrToolBarPanel, BorderLayout.NORTH);
		this.add(statusBar, BorderLayout.SOUTH);
		this.add(jBrowserPanel, BorderLayout.CENTER);
	}

	void updateStatusInfo(String statusMessage) {
		statusBar.lblStatus.setText(statusMessage);
	}

	/**
	 * Check the current input URL string in the address text field, load it,
	 * and update the status info and toolbar info.
	 */
	void loadURL() {
		String inputValue = jAddressTextField.getText();

		if (inputValue == null) {
			JOptionPane.showMessageDialog(this, "The given URL is NULL:",
					"Warning", JOptionPane.WARNING_MESSAGE);
		} else {
			// Check if the text value is a URL string.
			URL curUrl = null;

			try {
				// Check if the input string is a local path by checking if it
				// starts
				// with a driver name(on Windows) or root path(on Unix).
				File[] roots = File.listRoots();

				for (int i = 0; i < roots.length; i++) {
					if (inputValue.toLowerCase().startsWith(
							roots[i].toString().toLowerCase())) {
						File curLocalFile = new File(inputValue);

						curUrl = curLocalFile.toURL();
						break;
					}
				}

				if (curUrl == null) {
					// Check if the text value starts with known protocols.
					if (inputValue.toLowerCase().startsWith("http://")
							|| inputValue.toLowerCase().startsWith("https://")
							|| inputValue.toLowerCase().startsWith("ftp://")
							|| inputValue.toLowerCase().startsWith("gopher://")
							|| inputValue.toLowerCase().startsWith("file://")) {
						curUrl = new URL(inputValue);
					} else {
						if (inputValue.toLowerCase().startsWith("ftp.")) {
							curUrl = new URL("ftp://" + inputValue);
						} else if (inputValue.toLowerCase().startsWith(
								"gopher.")) {
							curUrl = new URL("gopher://" + inputValue);
						} else {
							curUrl = new URL("http://" + inputValue);
						}
					}
				}

				webBrowser.setURL(curUrl);

				// Update the address text field, statusbar, and toolbar info.
				updateStatusInfo("Loading " + curUrl.toString() + " ......");
			} catch (MalformedURLException mue) {
				JOptionPane.showMessageDialog(this,
						"The given URL is not valid:" + inputValue, "Warning",
						JOptionPane.WARNING_MESSAGE);
			}
		}
	}

	void jGoButton_actionPerformed(ActionEvent e) {
		loadURL();
	}

	void jAddressTextField_actionPerformed(ActionEvent e) {
		loadURL();
	}

	void jBackButton_actionPerformed(ActionEvent e) {
		webBrowser.back();
	}

	void jForwardButton_actionPerformed(ActionEvent e) {
		webBrowser.forward();
	}

	void jRefreshButton_actionPerformed(ActionEvent e) {
		webBrowser.refresh();
	}

	void jStopButton_actionPerformed(ActionEvent e) {
		webBrowser.stop();
	}
}

class Browser_jAddressTextField_actionAdapter implements
		java.awt.event.ActionListener {
	Browser adaptee;

	Browser_jAddressTextField_actionAdapter(Browser adaptee) {
		this.adaptee = adaptee;
	}

	public void actionPerformed(ActionEvent e) {
		adaptee.jAddressTextField_actionPerformed(e);
	}
}

class Browser_jBackButton_actionAdapter implements
		java.awt.event.ActionListener {
	Browser adaptee;

	Browser_jBackButton_actionAdapter(Browser adaptee) {
		this.adaptee = adaptee;
	}

	public void actionPerformed(ActionEvent e) {
		adaptee.jBackButton_actionPerformed(e);
	}
}

class Browser_jForwardButton_actionAdapter implements
		java.awt.event.ActionListener {
	Browser adaptee;

	Browser_jForwardButton_actionAdapter(Browser adaptee) {
		this.adaptee = adaptee;
	}

	public void actionPerformed(ActionEvent e) {
		adaptee.jForwardButton_actionPerformed(e);
	}
}

class Browser_jRefreshButton_actionAdapter implements
		java.awt.event.ActionListener {
	Browser adaptee;

	Browser_jRefreshButton_actionAdapter(Browser adaptee) {
		this.adaptee = adaptee;
	}

	public void actionPerformed(ActionEvent e) {
		adaptee.jRefreshButton_actionPerformed(e);
	}
}

class Browser_jStopButton_actionAdapter implements
		java.awt.event.ActionListener {
	Browser adaptee;

	Browser_jStopButton_actionAdapter(Browser adaptee) {
		this.adaptee = adaptee;
	}

	public void actionPerformed(ActionEvent e) {
		adaptee.jStopButton_actionPerformed(e);
	}
}

class Browser_jGoButton_actionAdapter implements java.awt.event.ActionListener {
	Browser adaptee;

	Browser_jGoButton_actionAdapter(Browser adaptee) {
		this.adaptee = adaptee;
	}

	public void actionPerformed(ActionEvent e) {
		adaptee.jGoButton_actionPerformed(e);
	}
}
